package com.common.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * SQL参数处理和检查的工具类
 *
 * @since 2022-2-14
 */
public class SqlParamsUtil {
	/**
	 * 日志记录对象
	 */
	private static final Logger logger = LoggerFactory.getLogger(SqlParamsUtil.class);

	/**
	 * 正则表达式
	 **/
	//private static final String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";
	private static final String reg = "(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(insert|drop|alter|delete|update|truncate)\\b)";

	/**
	 * \\b 表示 限定单词边界 比如 select 不通过 1select则是可以的
	 */
	private static final Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);

	/**
	 * SQL关键字
	 */
	private static final String SQL_KEYWORD = "insert|drop|alter|delete|update|truncate";

	/**
	 * 关键字校验器
	 */
	private static final Pattern KEYWORD_PATTERN = Pattern.compile(SQL_KEYWORD);

	/**
	 * 是否含有SQL注入
	 * 
	 * @param str 校验字符串
	 * @return 返回是否含有SQL注入
	 */
	public static boolean validSqlInjection(String str) {
		if (StringUtils.isBlank(str)) {
			return false;
		}
		if (sqlPattern.matcher(str.toLowerCase()).find()) {
			logger.error("SQL参数：[{}]存在盲注风险！", str);
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 是否支持包含SQL执行危险项
	 * 
	 * @param sql 输入参数
	 * @return 是否危险
	 */
	public static boolean validDangerousSql(String sql) {
		Matcher matcher = KEYWORD_PATTERN.matcher(sql.toLowerCase());
		return matcher.find();
	}
}
